Maeiee Weekly No.6
文章
- 《Emacs as a Time Tracker》
- 时间跟踪帮助更好管理自我、更好利用时间
- 尝试过的工具
- 电子表格:能用,但是不完美
- GTK timetaker:不错,但是不跨平台
- Markdown:输入简单,统计费劲
- 看 YouTube 视频学 Emacs/Org Mode
- 注:教程确实很多
- Org clock workflow
- 每天开始,建新 org 文件,创建任务清单
- 开始任务,
org-clock-in
,doom emacsspc m c i
org-clock-out
,doom emacsspc m c o
- click in(打卡),任务添加新计时条目
- org 顶部创建表格,时间报告
org-clock-report
,spc m c R
- 更新时间报告
org-update-all-dblock
- 不建议非 Emacs 使用,学成本太高
- 《Application binary interface - 维基百科》
- ABI 是二进制程序模块之间的接口,包括:
- 处理器指令集,寄存器结构、堆栈组织、内存访问类型
- 数据库可直接访问的基本数据类型和布局
- 调用约定,传参、返回值方式
- 如何进行系统调用
- 对象文件、程序库的二进制格式
- 一头是库或者操作系统特性,另一头是用户程序
- 定义了如何在机器码中访问数据结构或程序
- 低级的,依赖硬件的格式
- 举例 X86 调用约定(x86 calling conventions)
- 遵守 ABI 是编译器、操作系统、库的任务
- 英特尔二进制兼容标准(iBCS)
- 允许支持该 ABI 的操作系统的程序
- 无需修改在这一类系统上运行
- ABI 是二进制程序模块之间的接口,包括:
- 《[Dart翻译]用Dart和Wasm做实验》
- Wasm GC 提案
- 最初 wasm 不是为 GC 语言(Dart、Java/Kotlin)而设计
- GC 语言编译到 wasm 困难
- 将 Dart 编译到 wasm
- 早期探索阶段,感兴趣
- wasm 缺乏 GC,Dart 必须将垃圾回收实现一同编译
- GC 实现过于复杂
- 增加包大小、启动耗时
- dart2wasm 原型:效果不错
- Dart 与 wasm 互操作性(interop)
- Dart 中加载并调用 wasm 模块
- Dart FFI:与 C 库相互,缺点是特定于平台,分发复杂
- 分发 wasm 模块简单,一份二进制到处执行,通过 pub 分发
- package:wasm:
- 基于 wasmer,支持 WASI 操作系统交互接口
- 加载 wasm 二进制,Dart 对象 WasmModule
- .describe() 描述模块内方法,.instantiate() 构建实例
- 查看模块实例占用的内存
- 案例1:Brotli 压缩库
- Brotli 编译为 wasm 模块
- 在 Dart 中载入 Brotli
- 传入文件,进行压缩、报告压缩率、解压
- 将 C 语言编译为 wasm:通过 wasienv
- Wasm GC 提案
- 《标准化中的 WASI:在 web 之外运行 WebAssembly 的系统接口》
- WebAssembly System Interface,wasm 系统接口
- wasm 需要概念操作系统的系统接口
- 三份实现:
- wasmtime,Mozilla 的 WebAssembly 运行时
- Lucet,Fastly 的 WebAssembly 运行时
- 浏览器 polyfill
- 什么是系统接口?
- 保护屏障:内核
- 系统调用:内核向用户空间提供的接口
- Emscripten
- 在 Web 上模拟 POSIX
- Emscripten 定制 libc(wasm + JavaScript 胶水)
- 可移植性
- POSIX、Unix:源码可移植性,一次编写多次编译,到处执行
- wasm:一次编写,一次编译,到处执行
- wasi-core
- 类似 POSIX,所有程序需要的基本接口
- 文件、网络、时钟、随机数……
- wasi-sysroot:根据 wasi-core 实现 libc
- 《WebAssembly Aims to Eliminate the File System》
- WASI 最新计划取消文件系统,甚至也包括操作系统
- WebAssembly System Interface
- WASI 字节码联盟联合创始人 Lin Clark 声明
- WASI
- 将 WebAssembly 移出浏览器
- 贴近处理器 ISA 架构提供底层抽象
- WASI 提供一套围绕操作系统的 "狭义范围 " API
- 模块化结构,可扩展
- 文件系统:“文件”存储数据集,一个隐喻,数据在各程序间共享
- WASI 虚拟文件系统(老架构)
- 文件本身位于 WASM 模块中
- I/O类型,如流和数组,具有完全的可移植性
- WASI I/O (新架构)
- 程序不会调用文件,而是调用 I/O类型本身的指针
- 数组、字符串
- 开发者不再考虑文件问题,只考虑纯粹的 I/O 操作
- 新架构的好处
- 简化同一 Pod 上两个容器的通信
- 省去序列化和反序列化,省去 I/O 多次拷贝
- WebAssembly为Kubernetes提供安全保障
- Krustlet:运行 wasm workload
- KubeWarden:k8s 策略引擎和 admission 控制器
- k8s 最佳实践策略即代码
- 要么编写大量 YAML 文件,要么学习一种新语言
- 通过 KubeWarden 使用 Rust 或 Golang 编写策略
- WASI 最新计划取消文件系统,甚至也包括操作系统
- 《Why WebAssembly Belongs Outside the Browser》
- 为什么 WebAssembly 属于浏览器之外
- Wasm 历史
- 2015 Luke Wagner 声明
- 两个主要目标:
- 在浏览器中运行二进制的标准
- 推动各大浏览器支持
- WebAssembly Core Specification
- 大规模落地:Adobe、Figma
- 非浏览器运行时
- Wasmtime、Wamr、Wasm3、WasmEdge、Wasmer
- WebAssembly System Interface (WASI)
- 访问系统资源:文件系统、环境变量、时钟、随机数
- Bytecode Alliance:字节码联盟
- 用于运计算的优势
- 安全:隔离状态运行不受信任的代码
- 跨平台/跨架构:编写一次,到处运行
- 多语言(Polyglot):
- WebAssembly 一大目标将浏览器扩展到多语言
- 云开发更加需要多语言
- 高性能、执行效率、二进制大小
- 安全
- wasm 提供一个简单的、容易理解的表面区域
- 确保代码在沙盒内运行
- 沙盒边界互动被明确定义
- 在简单性和可攻击面低于虚拟机和容器
- 跨平台/跨架构
- 完全与平台和架构无关的
- 远远超过诸如 JVM 或其他 "一次编译,随处运行 "的技术的想象
- 真正实现一次编译,在任何地方运行
- 其中真正的亮点在于组件模型
- 开发者编写代码,并将他们的API作为接口输出
- 可以使用任何语言实现
- 接口实现方和使用方使用不同语言
- 作为 Kubernetes 运行时
- 容器的缺点:在任何地方运行的背后
- 为了支持不同的平台,平台+arch组合建立不同镜像
- 容器是一种 Linux 技术
- 容器开销导致无法接近边缘
- 在云服务器和边缘设备可以执行同样的代码,不需要重新编译
- 容器的缺点:在任何地方运行的背后
- Polyglot 多语言
- 许多语言开始支持 Wasm 编译
- 同一个程序不同部分,用不同语言来编写
- Wasm 有望成为终极插件模型
- 速度
- 边缘计算、物联网:虚拟机和容器妨碍从硬件中获取性能
- 我们可以(而且应该!)直接在裸机上运行 Wasm
- 高性能、执行效率、二进制大小
- 降低伸缩成本
- JIT/AOT 运行时:性能更高
- 《Easing into Emacs org-mode》
- 提高生产力不是一件容易的事
- 长久使用 TaskPaper
- 经营数百万美元业务和个人生活
- 局限性:日期、二次开发、重复任务、macOS 单平台
- 扩展:
- deft:快速创建、搜索、添加笔记
- 受到 Notational Velocity 的启发
- fork:nvALT
- 派生出 Zettledeft:Zettelkasten 信息系统
- 受到 Notational Velocity 的启发
- org-mode 扩展:
- org-journal:记日记
- org-habits:习惯跟踪
- 可视化展示
- 避免在长期目标上自欺欺人
- org-super-agenda:议程
- 对议程日历的增强
- 分类:今天、习惯、即将到期、已到期
- 强烈推荐,定制性高
- deft:快速创建、搜索、添加笔记
- Workflow 以周维度管理
- 标签形式 w35,代表第35周
- 标签分类:上下文维度、工作类型
- 组合标签::ea:perso:w26: 指派给行政助理的私人事务
- 5 个 TODO 状态划分:TODO、WAIT、GAVE (委托)、KILL (取消)、DONE
- Deft+org-journal+org-caputure:快速放入收件箱,以便日后处理
- 创建每日日记
- 每日工作流
- 调出每日视图
- 处理收件箱:移到它们应该在的地方
- 看一下到期、逾期和即将到期的事情
- 处理待办事项视图
- 没有使用计时功能:
- 这是疯狂的矫枉过正
- 我是在努力提高工作效率
- 而不是为我一天中的每一分钟辩解
- 尽管有可能帮助找出浪费的时间
- :LOGBOOK: 跟踪
- 直到在什么时候做了什么
- 对实际花费的时间有了更多认识
- Contacts 模块:生日、纪念日支持,日程融合
- 缺点:
- 你想改变 org mode,实际上是 org mode 改变了你
- 定制门槛高,被 elisp 的奇怪咒语洗脑了
- 围绕 emacs 痴迷
- 痴迷折腾配置,结果该干的活没干
- 末尾包含一份 Org Mode config
- 《Going from JavaScript to WebAssembly in three steps》
- Micrio:在线看超高清油画的平台
- 从 JavaScript 实现迁移到 WebAssembly
- 考虑因素:性能、流量、浏览器兼容性、体验
- WebAssembly (Wasm) 介绍
- 在浏览器中以接近原生速度运行编译后代码
- W3C 标准认证
- 第 4 官方 Web 语言(继 HTML/CSS/JavaScript)
- 支持语言:
- C/C++、Rust、Go、AssemblyScript 等
- 在浏览器中运行
- JavaScript 版本
- 使用 Canvas2D 渲染 2D 图像
- 使用 three.js/WebGL 渲染 360° 图像
- 使用 ES6 JavaScript 编写
- wasm 尝试1:C++、emscripten
- emscripten:
- 将 C/C++ 项目编译为 .wasm 二进制
- 在浏览器中原生执行
- emscripten 对 libsdl 良好兼容性
- 底层音频、键鼠外设、OpenGL
- 最大的挑战是捡起 C++ 语言
- 效果:运行流畅
- emscripten:
- 不足
- 老套的 C++
- 像回到了过去
- 对 Web 开发者有些过时
- 花了很长时间优化 Makefile
- 编译后的 .wasm 很大
- WebAssembly binary 760KB
- 对比 JavaScript 版本 240KB
- 二进制里打包了很多 Micrio 没用到的功能
- 胶水文件 glue
- wasm 需要对 JavaScript与浏览器绑定
- 浏览器不会自动识别 C++ 代码
- emscripten 插入额外胶水 JavaScript
- 加上胶水,总包大小 791KB,太大了
- 老套的 C++
- wasm 尝试2:AssemblyScript
- AssemblyScript
- 专门为 WebAssembly 创建的语言,使用 TypeScript 语法
- 写(近似)TypeScript,编译成 wasm 二进制
- 基于 npm 生态,前端友好
- 提供 glue-tooling
- JavaScript 以同步调用 AssemblyScript 导出模块
- 架构改进思考
- 部分下沉到 WebAssembly
- 之重写坐标计算部分,渲染、时间处理仍 JavaScript
- 结果
- 包大小 3KB
- 将 wasm 通过 base64 写入 JavaScript Bundle
- AssemblyScript
- wasm 尝试3:完全用 AssemblyScript 重写
- WebAssembly 内存 WebGL 打通
- WebAssembly 程序允许申请 16MB 内存
- 该内存在 JavaScript 可访问(像访问 ArrayBuffer)
- WebAssembly 将 3D 数据放入内存,JavaScript 将其传入 WebGL
- WebAssembly 内存 WebGL 打通
- 效果测试
- 三个版本:JS/Wasm/Wasm+WebGL
- 包大小:JavaScript(444KB)+ three.js(607KB),尝试3(371KB)
- 服务器 gzip 压缩后,实际 73KB
- CPU:65% less CPU
- Micrio:在线看超高清油画的平台